x86/AMD: work around erratum 793
authorJan Beulich <jbeulich@suse.com>
Tue, 3 Dec 2013 08:49:54 +0000 (09:49 +0100)
committerJan Beulich <jbeulich@suse.com>
Tue, 3 Dec 2013 08:49:54 +0000 (09:49 +0100)
The recommendation is to set a bit in an MSR - do this if the firmware
didn't, considering that otherwise we expose ourselves to a guest
induced DoS.

This is CVE-2013-6885 / XSA-82.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
xen/arch/x86/cpu/amd.c
xen/include/asm-x86/msr-index.h

index 472df680c8e8fda500dbe0b0e3a93256e8b9bef4..487ef4def884403cc07f0ca4f166986e4d225324 100644 (file)
@@ -476,6 +476,20 @@ static void __devinit init_amd(struct cpuinfo_x86 *c)
                       "*** Pass \"allow_unsafe\" if you're trusting"
                       " all your (PV) guest kernels. ***\n");
 
+       if (c->x86 == 0x16 && c->x86_model <= 0xf) {
+               rdmsrl(MSR_AMD64_LS_CFG, value);
+               if (!(value & (1 << 15))) {
+                       static bool_t warned;
+
+                       if (c == &boot_cpu_data || opt_cpu_info ||
+                           !test_and_set_bool(warned))
+                               printk(KERN_WARNING
+                                      "CPU%u: Applying workaround for erratum 793\n",
+                                      smp_processor_id());
+                       wrmsrl(MSR_AMD64_LS_CFG, value | (1 << 15));
+               }
+       }
+
        /* AMD CPUs do not support SYSENTER outside of legacy mode. */
        clear_bit(X86_FEATURE_SEP, c->x86_capability);
 
index e597a28a236cac668aefe262af912df36e33e6e4..fc9fbc654407042938f2350f6cc5799014f567c9 100644 (file)
 
 /* AMD64 MSRs */
 #define MSR_AMD64_NB_CFG               0xc001001f
+#define MSR_AMD64_LS_CFG               0xc0011020
 #define MSR_AMD64_IC_CFG               0xc0011021
 #define MSR_AMD64_DC_CFG               0xc0011022
 #define AMD64_NB_CFG_CF8_EXT_ENABLE_BIT        46